#include"hecpakec.h"
#include<stdio.h>
#include<stdlib.h>

// -检查bit位是否一致
void checkData(unsigned char * data,unsigned char * newdata,int size){

    for(int index = 0;index <= (size/2);++index){

        if(newdata[index] != data[index]){

            printf("no equal.\n");
            break;
        }
    }
}
DecPack * DecPack_create(int sz){

    DecPack * dp = malloc(sizeof(DecPack));
    if(NULL == dp){

        printf("malloc DecPake object failed.\n");
        return NULL;
    }
    dp->size = sz;  // -这个是长度
    dp->used = 0;

    // -为data动态分配内存时
    if(0 != dp->size%2){

        sz++;
    }
    // -需要多少个字节来存储这个数的数位
    sz = (sz/2);
    dp->data = malloc(sizeof(unsigned char)*sz);
    // checking
    if(NULL == dp->data){

        printf("malloc unsigned char failed.\n");
        free(dp);
        return NULL;
    }
    return dp;
}
// -插入一个位数
// -当分配的内存已经满，则将size翻倍
// -为新的数位
void DecPack_insert(DecPack * dp,int val){
    if(NULL == dp){
        return;
    }
    // -判断这个val的值是否在[0,9]之间 不在这个区间 则直接返回
    if((val < 0) || (val > 9)){ return; }
    int used = dp->used;
    if(used == dp->size){
        // -原本申请的空间是size的一半
        unsigned char * newdata = malloc(sizeof(unsigned char)*used);
        if(NULL == newdata){
            printf("new data malloc failed.\n");
            return;
        }
        int iter = 0;
        // -这里的等号 主要是size偶数的问题
        for(iter = 0;iter <= dp->size;iter+=2){
            newdata[iter/2] = dp->data[iter/2];
        }
        checkData(dp->data,newdata,dp->size);
        free(dp->data);
        dp->data = newdata;
        dp->size *= 2;
    }
    // -下面才是算法的核心
    // -奇数位存储在低四位（从0开始的）
    if(used%2 == 0){
        // -因为已经校验过val的范围 可以直接赋值
        dp->data[used/2] = val;
    }else{
        // -奇数位存储在高四位（从0开始的）
        // -左移四位
        val = (val << 4);
        // -经过左移四位这个时候低四位已经全部是0
        dp->data[used/2] = val + dp->data[used/2];
    }
    // -这个加1 是为下一个做的准备
    dp->used++;
}

int DecPacke_delete(DecPack * dp){
    if(dp->used == 0){
        printf("dp->used is zero,so no number could delete.\n");
        return -1;
    } 
    // -因为used都是先于一个当前的
    dp->used--;
    int res = 0;
    if(0 == (dp->used % 2)){
        res = dp->data[dp->used/2] & 0x0F;
        dp->data[dp->used/2] = 0;
    }else{

        res = dp->data[dp->used] & 0xF0;
        res = res >> 4;
        dp->data[dp->used/2] = dp->data[dp->used/2] & 0x0F;
    }
}

int DecPack_print(DecPack * dp){

    for(int index = 0;index < dp->used;index++){

        if(index%2 == 0){
            // -左移四位
            printf("%d.",dp->data[index/2] & 0x0f);
        }else{

            // -右移四位
            printf("%d.",dp->data[index/2] >> 4);
        }
    }
    printf(".\n");
}

void DecPack_destory(DecPack * dp){

    if(NULL == dp){

        return;
    }
    if(NULL == dp->data){

        free(dp->data);
    }
    free(dp);
}

// -简单case测试
int main(int argc,char * argv[]){

    // -对于分解一个数字（可以利用取余来逐步分割数字的各个数位）
    DecPack * dp = DecPack_create(3);
    
    int testNumber =  123456;

    while (testNumber)
    {
        int tmp = testNumber%10;
        testNumber = testNumber/10;
        printf("tmp Number = %d.\n",tmp);
        DecPack_insert(dp,tmp);
    }
    DecPacke_delete(dp);
    DecPacke_delete(dp);
    DecPack_print(dp);
    DecPack_destory(dp);
    return EXIT_SUCCESS;
}